@Tony Araujo
caso o player dar trade com o item unique vai aparecer a mensagem que ele não pode negociar itens unique?
- Fórum
- OTServ
- Recursos
- Linguagens de Programação
- [C++] Unique Item System - ATUALIZADO! (No-bugs)
[C++] Unique Item System - ATUALIZADO! (No-bugs)
Por Tony Araujo, 16 de mar. de 2019 em Linguagens de Programação
info
Grupo: Visconde
Registrado: 27/02/13
Posts: 446
Reputação: +282
Gênero: Masculino

29 minutos atrás, Brunds disse:@Tony Araujo
caso o player dar trade com o item unique vai aparecer a mensagem que ele não pode negociar itens unique?
Muito bem lembrado, vou adicionar a condição pertencente a isso. Muito obrigado brow!
@Tópico
Editado e adicionado a condição.
Adicionado imagens do funcionamento.
Editado Março 16 por Tony Araujo
Se eu colocar um item unique em uma bag e joga-la, iria ser impedido ? Ou se eu colocar o item unique em um baú ou caixa pelo mapa, irá reconhecer que o container não está no meu inventario ?
Editado Março 16 por XZero
2 horas atrás, XZero disse:Se eu colocar um item unique em uma bag e joga-la, iria ser impedido ? Ou se eu colocar o item unique em um baú ou caixa pelo mapa, irá reconhecer que o container não está no meu inventario ?
voce vai colocar pra quando o jogador ganhar o item ao abrir o bau vai ser unique assim ele não da trade e nem pode jogar fora
O bichão apareceu.
info
Grupo: Campones
Registrado: 05/04/18
Posts: 95
Reputação: +46
Gênero: Masculino
Char no Tibia: Deetrax

Eii professor no caso para você adicionar no script seria assim ??
function onUse(cid, item, frompos, item2, topos) -- Não mecha.
storage = 2353468
item = 15784
nomeitem = "teste"
quantidade = 1
level = 100
if getPlayerLevel(cid) >= level and getPlayerStorageValue(cid,storage) == -1 then
doPlayerSendTextMessage(cid,25,"Você achou a "..nomeitem.." escondida.")
doPlayerAddItem(cid, item, quantidade)
doItemSetAttribute(item.uid, "unique", 1)
-- setPlayerStorageValue(cid,storage,1)
elseif getPlayerLevel(cid) <= level then
doPlayerSendTextMessage(cid,25,"Você precisa ser level "..level.." ou mais.")
elseif getPlayerStorageValue(cid,storage) >= 1 then
doPlayerSendTextMessage(cid,25,"Você já fez está quest")
end
return true
end
info
Grupo: Campones
Registrado: 20/06/15
Posts: 92
Reputação: +29
Gênero: Masculino

11 horas atrás, XZero disse:Se eu colocar um item unique em uma bag e joga-la, iria ser impedido ? Ou se eu colocar o item unique em um baú ou caixa pelo mapa, irá reconhecer que o container não está no meu inventario ?
Testei aqui e acontece o seguinte:
se eu colocar o item que está como "unique" em um Bag estou conseguindo jogar ela e o item no chão, o mesmo ocorre quando eu coloco o item em um bau pelo map, estou conseguindo como se o item não fosse unique...
1 hora atrás, gabrielzika disse:Testei aqui e acontece o seguinte:
se eu colocar o item que está como "unique" em um Bag estou conseguindo jogar ela e o item no chão, o mesmo ocorre quando eu coloco o item em um bau pelo map, estou conseguindo como se o item não fosse unique...
Hum..
Como pensei o sistema não está 100%, tenho um sistema unique aqui e ocorre o mesmo problema.
6 horas atrás, gabrielzika disse:Testei aqui e acontece o seguinte:
se eu colocar o item que está como "unique" em um Bag estou conseguindo jogar ela e o item no chão, o mesmo ocorre quando eu coloco o item em um bau pelo map, estou conseguindo como se o item não fosse unique...
manda o script que da o item pelo bau
40 minutos atrás, Brunds disse:manda o script que da o item pelo bau
Cara não é quest, é um baú qualquer pelo mapa, coloca o item unique la e qualquer pessoa pode pegar.
@XZero lógico que sim isso funciona com qualquer item. Esse sistema de unique só funciona com script action ou que faça ganhar o item ai da para setar o unique no item ganhado
Editado Março 17 por Brunds
Agora, Brunds disse:@XZero lógico que sim isso funciona com qualquer item só funciona com script action ou que faça ganhar o item ai da para setar o unique nele
Que script cara, esquece esse script, suponha que eu tenha um item unique coloque dentro de um recipiente pelo mapa uma box (caixa) outra pessoa pode ir la e pegar.
@XZero ata o vodkart tinha me dito uma vez que tinha que fazer um movement se baseando no unique ai qualquer item que seja unique seria impossivel de retirar da bag para qualquer outro lugar






info
Grupo: Visconde
Registrado: 27/02/13
Posts: 446
Reputação: +282
Gênero: Masculino
[C++] Unique Item System
testado: TFS - 0.3.6 (porém acredito que funcione em outros)
autor: Tony Araújo (OrochiElf)
contribuição: gristony
Olá galera, beleza? Então, tem tanto tempo que eu não faço minhas contribuições e hoje eu resolvi postar um sistema bastante simples, porém de extrema necessidade e importância nos servidores que dão items iniciais aos jogadores, especialmente os poketibias. Então com esse sistema o jogador fica impossibilitado de jogar o item fora e também de fazer trocas com outros jogadores, sendo literalmente únicos. Eu criei ele em cima do código do TFS 0.3.6, porém é um sistema com o código completamente simples, então acredito que se instalado atentamente em outras versões, funcione sem problemas.
Bom, sem mais delongas vamos ao que interessa.
Vá ao game.cpp e procure por esta função:
bool Game::playerMoveItem(uint32_t playerId, const Position& fromPos, uint16_t spriteId, int16_t fromStackpos, const Position& toPos, uint8_t count)Então, dentro desta mesma função, você procura por esta condição aqui.
if(!player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { if((std::abs(playerPos.x - mapToPos.x) > item->getThrowRange()) || (std::abs(playerPos.y - mapToPos.y) > item->getThrowRange()) || (std::abs(mapFromPos.z - mapToPos.z) * 4 > item->getThrowRange())) { player->sendCancelMessage(RET_DESTINATIONOUTOFREACH); return false; } }E logo abaixo adicione esta condição:
Item* tmpItem = NULL; Container* tmpContainer = NULL; if(tmpContainer = item->getContainer()) { for(ContainerIterator it = tmpContainer->begin(); it != tmpContainer->end(); ++it) { if(tmpItem = (*it)->getItem()) { boost::any value = tmpItem->getAttribute("unique"); if(!value.empty() && getMap()->getTile(toPos)) { player->sendCancel("Has a unique item in this bag, you can't drop this item."); return false; } } } } boost::any value = item->getAttribute("unique"); if(!value.empty() && (!toCylinder->getItem() && toCylinder != player && toCylinder->getParent() != player || toCylinder->getItem() && toCylinder->getItem()->isGroundTile() || toCylinder->getItem() && toCylinder->getItem()->getContainer() && !toCylinder->getItem()->getContainer()->getDepot() && toCylinder->getItem()->getParent() != player)) { player->sendCancel("It is a unique item, you can't drop this item."); return false; }Certo. Continuando no game.cpp, você vai procurar pela função:
ReturnValue Game::internalMoveItem(Creature* actor, Cylinder* fromCylinder, Cylinder* toCylinder, int32_t index, Item* item, uint32_t count, Item** _moveItem, uint32_t flags /*= 0*/)Dentro da função, você procura pela condição:
//update item(s) if(item->isStackable())E troque por esta:
//update item(s) if(item->isStackable()) { if(toItem && toItem->getID() == item->getID()) { boost::any item_value = item->getAttribute("unique"); boost::any toItem_value = toItem->getAttribute("unique"); if(!item_value.empty() && !toItem_value.empty() || item_value.empty() && toItem_value.empty()) { n = std::min((uint32_t)100 - toItem->getItemCount(), m); toCylinder->__updateThing(toItem, toItem->getID(), toItem->getItemCount() + n); updateItem = toItem; } } if(m - n > 0) { moveItem = Item::CreateItem(item->getID(), m - n); boost::any value = item->getAttribute("unique"); if(!value.empty()) moveItem->setAttribute("unique", 1); } else moveItem = NULL; if(item->isRemoved()) freeThing(item); }Sem sair do game.cpp, você procura pela função:
bool Game::playerRequestTrade(uint32_t playerId, const Position& pos, int16_t stackpos, uint32_t tradePlayerId, uint16_t spriteId)Dentro dela, você procura pela condição:
if(!tradeItem || tradeItem->getClientID() != spriteId || !tradeItem->isPickupable() || (tradeItem->isLoadedFromMap() && (tradeItem->getUniqueId() != 0 || (tradeItem->getActionId() != 0 && tradeItem->getContainer())))) { player->sendCancelMessage(RET_NOTPOSSIBLE); return false; }E logo abaixo você adiciona a condição:
boost::any value = tradeItem->getAttribute("unique"); if(!value.empty()) { player->sendTextMessage(MSG_INFO_DESCR, "It is a unique item, you can't trade this item."); return false; } Item* tmpItem = NULL; Container* tmpContainer = NULL; if(tmpContainer = tradeItem->getContainer()) { for(ContainerIterator it = tmpContainer->begin(); it != tmpContainer->end(); ++it) { if(tmpItem = (*it)->getItem()) { boost::any value = tmpItem->getAttribute("unique"); if(!value.empty()) { player->sendTextMessage(MSG_INFO_DESCR, "Has a unique item in this bag, you can't trade this item."); return false; } } } }Pronto, seu sistema de unique está instalado e pronto para ser utilizado. Para você setar o item unique, basta:
doItemSetAttribute(item.uid, "unique", 1)Algumas imagens
- NÃO PODE DAR TRADE COM ITEMS UNIQUES


- E TAMBÉM NÃO PODE DAR TRADE COM BAGS QUE TENHAM UNIQUE ID DENTRO
-NÃO PODE JOGAR O ITEM NO CHÃO

- SE TENTAR JOGAR O ITEM NO CHÃO OU EM ALGUMA BAG NO CHÃO

- NEM MESMO SE TIVER DENTRO DE UMA BAG
-
- SÓ É POSSÍVEL GUARDAR DENTRO DO DEPOT

Bom, é isso galera, espero que gostem e façam bom proveito. ;D
Editado Março 21 por Tony Araujo